Recently, Ethernet technology has achieved amazing wire speeds. This drastic increase in transmission speed has been problematic for driver developers when creating drivers that are able to achieve high performance in Symmetric Multiprocessing (“SMP”) systems. The Ethernet adapters can achieve high wire speed and output a large number of packets, but sometimes the host system is too slow to process all the packets being received. For example, consider an SMP system with a PCI-E Ethernet adapter with 4×1 Gb/s ports. This Ethernet adapter can achieve a throughput of 941 Mb/s with just one port and a throughput of 2860 Mb/s when using all the ports together. The ideal throughput of the adapter using all ports should be 3764 Mb/s. As can be seen, this system is not achieving the achieving the ideal throughput and is not scaling linearly.
This problem occurs because the Ethernet adapter has four ports that share the same Interrupt Request (“IRQ”) line. An interrupt raised by this adapter is represented by an interrupt vector. This vector contains information about events on each port. An interrupt is generated every time this vector is updated. In many instances, an interrupt vector contains a single event for a single port. This is problematic in operating environment such as Linux. For example, the Linux 2.6 kernel has a daemon called IRQ_balance, which balances interrupts across all multiple processors or central processing units (also referred to as CPU or CPUs). This daemon runs in a 10 second interval and determines which CPU has the least loaded to bind an interrupt. The IRQ_balance daemon binds the IRQ of the Ethernet adapter among all the CPUs in a round robin way. Every time that the IRQ line is bound to a new CPU, the data of a port needs to be moved to the new CPU. This can cause a large number of cache misses and contention, which drastically decreases system performance when all ports are being used.
Therefore a need exists to overcome the problems with the prior art as discussed above.